package com.zzhua.jdk;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {

        // Animal在这个工程里, Animal只提供了一个接口,
        // 但是我们不仅获取到了animal的实例, 还调用了animal实例的eat()方法
        // eat方法的实现在这里是转交给 CustomizedInvocationHandler来实现的

        // 开启代理生成的保存设置
        System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        Class<Animal> cls = Animal.class;

        // 执行完这句就会在内存中动态生成一个代理类, 继承Proxy, 并且实现Animal接口
        // public final class $Proxy0 extends Proxy implements Animal{...}
        // 并且实现该接口的动态代理类只会生成一次(会缓存起来)
        Object o = Proxy.newProxyInstance(
                cls.getClassLoader(),
                new Class[]{Animal.class},
                new CustomizedInvocationHandler()
        );

        // 所以看起来就会这样: 调用过程, 突然就转向InvocationHandler中的方法去了
        Animal animal = (Animal) o;
        animal.eat();
    }
}
